This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

test<-read.csv("D:\allGroups\Females_Mated\Assa_Female_Mated_Unknown_RigA_20211025T120646\all_frames_degree.csv")
Error: '\F' is an unrecognized escape in character string starting ""D:\allGroups\F"

#creat graph for one movie in perframe

test<-read.csv("D:/allGroups/Females_Mated/Assa_Female_Mated_Unknown_RigA_20211025T120646/all_frames_degree.csv")


all_features<-read.csv("D:/allGroups/Females_Mated/Assa_Female_Mated_Unknown_RigA_20211025T120646/perframe_sum_allflies.csv")
sum_per_frames<-test[,c(1,3)]
colnames(sum_per_frames)<-c("Frame","Value")

#title
title_of_plot<-paste0(basename(path)," plot of dgree in each ",number_of_frame," frames_without angelsub")

all_features_new<-all_features[1:27000,]

data<-cbind(all_features_new,sum_per_frames$Value)

data_cor <- cor(data[ , colnames(data) != "Value"],  # Calculate correlations
                data$Value)
data_cor  
library(corrplot)
corrplot(data_cor, method="circle",tl.cex = 0.5)
corrplot(data_cor, type="upper", order="hclust", tl.col="black", tl.srt=45,tl.cex = 0.4)


#png(filename = "mycorrplot.png", width = 1200, height = 800)
corrplot(data_cor, method="circle", addCoef.col = 1, tl.cex = 0.5)
#dev.off()

  library(ggplot2)

p<-ggplot()+geom_line(data = sum_per_frames, mapping = aes(x = Frame, y = Value))
plot(p)


 

correlaction

install.packages("heatmaply")
Error in install.packages : Updating loaded packages
library(heatmaply)

# plotting corr heatmap
heatmaply_cor(x = cor(data), xlab = "Features",
            ylab = "Features", k_col = 2, k_row = 2)

install.packages("heatmaply")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Warning in install.packages :
  package ‘heatmaply’ is in use and will not be installed

library(lubridate)


my_t = ts(data[,1:2])

my_t = ts(s, start = c(2019,1), frequency = 19)


plot(aggregate(my_t), type="p", pch=20, cex=3, ylab="Aggregate per time unit")


set.seed(9797)
s_1 = seq(221:256)

# A cyclic vector for SEASONAL variations.
s_2 = cos(seq(from=1/12*pi, to=6*pi, by=(6*pi/36)))*5

# Random numbers for errors (white noise).
set.seed(65)
s_3 = rnorm(36)

# The data vector.
s = s_1 + s_2 + s_3

# The time series object is created.
my_t = ts(s, start = c(2019,1), frequency = 12)

# Plot the time series.
plot(my_t, ylab = "Values")
xts(data$Value, as.Date(data$Frame))



 library(zoo)
 #ZOO <- zoo(data$Value, as.character(data$Frame))
 ZOO <- zoo(data$Value)

 my_t<-ts(ZOO,frequency = 2700)
 plot(my_t)
 
 
plot(aggregate(my_t), type="p", pch=20, cex=3, ylab="Aggregate per time unit")

library(lubridate)

library(forecast)

my_vec<-as.vector(data$Value)
myts <- ts(my_vec, start=c(1, 1), frequency=2700)


 plot(myts)
 fit <- stl(myts, s.window="period")

plot(fit)

fit <- auto.arima(my_t)
forecast(fit, 20)


plot(forecast(fit, 2000))
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCmBgYHtyfQ0KbGlicmFyeShvcGVueGxzeCkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShpZ3JhcGgpDQpsaWJyYXJ5KFIubWF0bGFiKQ0KcGF0aCA9IkQ6L2FsbEdyb3Vwcy9GZW1hbGVzX01hdGVkIg0Kc2V0d2QocGF0aCkNCm51bWJlcl9vZl9mbHlzPC0xMA0KbnVtYmVyX29mX2ZyYW1lPC0xDQpmYWNhZGU8LUZBTFNFDQoNCiNzZXEgYnkgdGhlICBudW1iZXIgb2YgZnJhbWVzDQpudW1iZXJzPC1zZXEoMSwgMjcwMDEsIGJ5PW51bWJlcl9vZl9mcmFtZSkNCg0KZiA8LSBmdW5jdGlvbih4KSB7DQogICAgaWYoaXMubGlzdCh4KSkgbGFwcGx5KHgsIGYpDQogICAgZWxzZSBpZmVsc2UobGVuZ3RoKHgpID09IDAsIDAsIHgpDQp9DQoNCg0KDQpkaXI8LWxpc3QuZGlycyhyZWN1cnNpdmUgPSBGLHBhdGggPSBwYXRoKQ0KDQpmb3IobnVtX29mX21vdmllIGluIDE6bGVuZ3RoKGRpcikpew0KICAjaWYgdGhlIGZpbGUgZG9uJ3QgZXhpc3QgLGNyZWF0IGhpbQ0KICBpZighZmlsZS5leGlzdHMocGFzdGUwKGRpcltudW1fb2ZfbW92aWVdLCAnLycsJ2FsbF9mcmFtZXNfZGVncmVlLmNzdicpKSl7DQogIHByaW50KGRpcltudW1fb2ZfbW92aWVdKQ0KICAgIHByaW50KCJjcmVhdGluZyB0aGUgZmlsZSBvZiB0aGlzIGRpciIpDQogICNpdCBpcyB1bmRlciB0aGUgYXNzdW10aW9uIHRoYXQgdGhlcmUgaXMgMTAgZmx5cyBhbmQgdGhleSBhcmUgb3JnZW5pemVkIGluIHNwY2lmaWMgd2F5IGZyb20gdGhlIEFsbGludGVyYWN0aW9uLm1hdA0KICBtYXQgPC0gKHJlYWRNYXQocGFzdGUwKGRpcltudW1fb2ZfbW92aWVdLCAnLycsJ0FsbGludGVyYWN0aW9uLm1hdCcpKSkgIyByZWFkIGVhY2ggTUFUIGZpbGUNCiAgc3ViX2xpc3RfbWF0PC1tYXRyaXgobWF0W1sibmV3LmludGVyYWN0aW9uRnJhbWVNYXRyaXgiXV0sbnJvdyA9IG51bWJlcl9vZl9mbHlzLCBuY29sID0gbnVtYmVyX29mX2ZseXMpDQogIGRmX21hdDwtYXMuZGF0YS5mcmFtZShzdWJfbGlzdF9tYXQpDQogIA0KDQogIA0KICANCiAgDQogICAgI1JFTU9WRSAwIChNRUFOIE5PIElOVEVSQUNUSU9OKQ0KICBmb3IoaSBpbiAxOm5jb2woZGZfbWF0KSl7DQogICAgZm9yKGogaW4gMTpucm93KGRmX21hdCkpew0KICAgICAgaWYobGVuZ3RoKHVubGlzdChkZl9tYXRbaSxqXSkpID09IDApew0KICAgICAgICBkZl9tYXRbaSxqXSA8LSBsYXBwbHkoZGZfbWF0W2ksal0sIGZ1bmN0aW9uKHgpeFtsZW5ndGhzKHgpID09IDBdIDwtIDApDQogICAgICB9DQogICAgfQ0KICB9DQogIA0KICBkZl9tYXQ8LW5hLm9taXQoZGZfbWF0KQ0KDQogIA0KDQogICMxMCBmbHlzDQogIGNvbG5hbWVzKGRmX21hdCk8LWMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIikNCiAgcm93bmFtZXMoZGZfbWF0KTwtYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiKQ0KICBub2RlczwtYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiKQ0KICBub2RlczwtYXMuZGF0YS5mcmFtZShub2RlcykNCiAgYWxsPC1kYXRhLmZyYW1lKCkNCiAgDQogIGZvcihpIGluIDE6bnVtYmVyX29mX2ZseXMpew0KICAgIGZvcihqIGluIDE6bnVtYmVyX29mX2ZseXMpew0KICAgICAgaWYobGVuZ3RoKHVubGlzdChzdWJfbGlzdF9tYXRbaSxqXSkpIT0wKXsNCiAgICAgICAgdGVtcF9udW1fZnJhbWVzPC11bmxpc3QoZGZfbWF0W2ksal0pDQogICAgICAgIHRvYmluZDwtYyhjb2xuYW1lcyhkZl9tYXRbaV0pLHJvd25hbWVzKGRmX21hdFtqLF0pKQ0KICAgICAgICB0b2JpbmQ8LWFzLmRhdGEuZnJhbWUodCh0b2JpbmQpKQ0KICAgICAgICAjdGhlIHZhbHVlIGZyb20gd2hlcmUgdGhlIGRpZmZyZW5jZSBpcyBiaWdnZXIgdGhhbiAxMjAgaW4gdGhlIG5leHQgZnJhbWUNCiAgICAgICAgc2VxX2ludGVyPC0gdGVtcF9udW1fZnJhbWVzW2RpZmYodGVtcF9udW1fZnJhbWVzKT4xMjBdDQogICAgICAgIGlmKGxlbmd0aChzZXFfaW50ZXIpPiAwKXsNCiAgICAgICAgICBudW1fb2Zfc2VxX2l0ZXI8LWxlbmd0aChzZXFfaW50ZXIpDQogICAgICAgICAgY3VycmVudF9paW5kZXg8LTENCiAgICAgICAgICBmb3IoayBpbiAxOm51bV9vZl9zZXFfaXRlcil7DQogICAgICAgICAgICB0b2JpbmQ8LWMoY29sbmFtZXMoZGZfbWF0W2ldKSxyb3duYW1lcyhkZl9tYXRbaixdKSkNCiAgICAgICAgICAgIHRvYmluZDwtYXMuZGF0YS5mcmFtZSh0KHRvYmluZCkpDQogICAgICAgICAgICANCiAgICAgICAgICAgIGluZGV4PC13aGljaCh0ZW1wX251bV9mcmFtZXMgPT0gc2VxX2ludGVyW2tdKQ0KICAgICAgICAgICAgdHRfdGVtcF9udW1fZnJhbWVzPC1hcy5kYXRhLmZyYW1lKHRlbXBfbnVtX2ZyYW1lcykNCiAgICAgICAgICAgIHRlbXBfYWxsX2ludGVyPC10dF90ZW1wX251bV9mcmFtZXNbY3VycmVudF9paW5kZXg6aW5kZXgsXQ0KICAgICAgICAgICAgY3VycmVudF9paW5kZXg8LWluZGV4KzENCiAgICAgICAgICAgIHRvYmluZDwtY2JpbmQodG9iaW5kLHRlbXBfYWxsX2ludGVyWzFdKQ0KICAgICAgICAgICAgdG9iaW5kPC1jYmluZCh0b2JpbmQsdGVtcF9hbGxfaW50ZXJbbGVuZ3RoKHRlbXBfYWxsX2ludGVyKV0pDQogICAgICAgICAgICBjb2xuYW1lcyh0b2JpbmQpPC1jKCJ0YWlsIiwiaGVhZCIsIm9uc2V0IiwidGVybWludXMiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBhbGw8LXJiaW5kKGFsbCx0b2JpbmQpDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIH1lbHNlew0KICAgICAgICAgIHRvYmluZDwtY2JpbmQodG9iaW5kLHRlbXBfbnVtX2ZyYW1lc1sxXSkNCiAgICAgICAgICB0b2JpbmQ8LWNiaW5kKHRvYmluZCx0ZW1wX251bV9mcmFtZXNbbGVuZ3RoKHRlbXBfbnVtX2ZyYW1lcyldKQ0KICAgICAgICAgIGNvbG5hbWVzKHRvYmluZCk8LWMoInRhaWwiLCJoZWFkIiwib25zZXQiLCJ0ZXJtaW51cyIpDQogICAgICAgICAgYWxsPC1yYmluZChhbGwsdG9iaW5kKQ0KICAgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgfQ0KICAgICAgICANCiAgICB9DQogIH0NCiAgDQogIGNvbG5hbWVzKGFsbCk8LWMoInRhaWwiLCJoZWFkIiwib25zZXQiLCJ0ZXJtaW51cyIpDQogIA0KICBhbGxbImhlYWQiXSA8LSBhcy5udW1lcmljKHVubGlzdChhbGxbImhlYWQiXSkpDQogIGFsbFsidGFpbCJdIDwtIGFzLm51bWVyaWModW5saXN0KGFsbFsidGFpbCJdKSkNCiAgDQogIA0KICANCiAgDQogIA0KICBhbGw8LWNiaW5kKGFsbCwxKQ0KICB2YWx1ZV9zdW1fZGY8LWRhdGEuZnJhbWUoKQ0KICBkYXRhPC1kYXRhLmZyYW1lKCkNCiAgdGVtcF9iZXR3ZWVuX3ZhbHVlczwtYygpDQoNCmZvcihpIGluIDE6KGxlbmd0aChudW1iZXJzKS0xKSl7DQogIHRlbXBfYmV0d2Vlbl92YWx1ZXM8LWMoKQ0KICAjZmluZCB0aG9zZSB0aGF0IGFyZSBiaWdnZXIgdGhhbiB0aGUgb25zZXQgYW5kIHNtYWxsIGZyb20gdGhlIHRlcm1pbnVzDQogIHRlbXBfYmV0d2Vlbl92YWx1ZXM8LWFsbCAlPiUgZmlsdGVyKG51bWJlcnNbaSsxXT49b25zZXQgJiBudW1iZXJzW2ldIDw9dGVybWludXMpDQogIGlmKCBucm93KHRlbXBfYmV0d2Vlbl92YWx1ZXMpIT0wKXsNCiAgICAjY2hhbmdpbmcgdGhlIGZvcm1hdCB0byBnZXQgIm1hdHJpeCIgd2l0aCB3aG8gaXMgaW4gaW50ZXJhY3Rpb24gd2l0aCB3aG8NCiAgdmFsdWVzPC1hY2FzdCh0ZW1wX2JldHdlZW5fdmFsdWVzLCB0YWlsfmhlYWQsZnVuLmFnZ3JlZ2F0ZT1zdW0pDQogICNjcmVhdCBtYXRyaXggaW4gdGhlIHNpemUgb2YgMTAgb24gMTAgd2l0aCAwIA0KICB6ZXJvX21hdHJpeCA8LSBtYXRyaXgoMCwgbmNvbCA9IDEwLCBucm93ID0gMTApDQogICNhbGxfdmFsdWVzIGNvbmF0aW9uIHdobyBpcyBpbiBpbnRhcnRjaW9uIHdpdGggd2hvIGluIHRoZSBzcGNpZmljIGZyYW1lDQogIGFsbF92YWx1ZXM8LWFjYXN0KHJiaW5kKG1lbHQodmFsdWVzKSwgbWVsdCh6ZXJvX21hdHJpeCkpLCBWYXIxflZhcjIsIHN1bSkNCiAgbmV0MiA8LSBncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgoYWxsX3ZhbHVlcyxtb2RlID0gInVuZGlyZWN0ZWQiKQ0KICAjY3JlYXQgYSBkZWdyZWUgDQogIGRlZyA8LSBkZWdyZWUobmV0MikNCiAgdmFsdWVfc3VtX3RlbXA8LWRhdGEuZnJhbWUoYmVnaW49bnVtYmVyc1tpXSxlbmQ9bnVtYmVyc1tpKzFdLGRlZ3JlZT0oc3VtKGRlZykvMikpDQogIHZhbHVlX3N1bV9kZjwtIGJpbmRfcm93cyh2YWx1ZV9zdW1fZGYsdmFsdWVfc3VtX3RlbXApDQogIH1lbHNlew0KICB2YWx1ZV9zdW1fdGVtcDwtZGF0YS5mcmFtZShiZWdpbj1udW1iZXJzW2ldLGVuZD1udW1iZXJzW2krMV0sZGVncmVlPTApDQogIHZhbHVlX3N1bV9kZjwtIGJpbmRfcm93cyh2YWx1ZV9zdW1fZGYsdmFsdWVfc3VtX3RlbXApDQogIH0NCiAgfQ0KICANCiN0aGUgZWxzZSBpcyB0byBnZXQgdGhlIHdob2xlIGZyYW1lIG9uIGludGVyYWN0aW9uIHNvIHdlIHNlZSB0aGUgYnVpbGR1cA0KZGF0YTwtIGFzLmRhdGEuZnJhbWUocGFzdGUwKHZhbHVlX3N1bV9kZiRiZWdpbiwiLSIsIHZhbHVlX3N1bV9kZiRlbmQpKQ0KZGF0YSR2YWx1ZTwtdmFsdWVfc3VtX2RmJGRlZ3JlZQ0KY29sbmFtZXMoZGF0YSk8LWMoIkZyYW1lIiwiVmFsdWUiKQ0KDQoNCmRhdGEkRnJhbWUgPC0gYXMuY2hhcmFjdGVyKGRhdGEkRnJhbWUpDQojVGhlbiB0dXJuIGl0IGJhY2sgaW50byBhIGZhY3RvciB3aXRoIHRoZSBsZXZlbHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXINCiNkYXRhJEZyYW1lPC1hcy5mYWN0b3IoZGF0YSRGcmFtZSkNCiNkYXRhJEZyYW1lIDwtIGZhY3RvcihkYXRhJEZyYW1lLCBsZXZlbHM9dW5pcXVlKGRhdGEkRnJhbWUpKQ0KZGF0YSRncm91cDwtYXMuY2hhcmFjdGVyKG51bV9vZl9tb3ZpZSkNCiNkYXRhJGdyb3VwIDwtIGZhY3RvcihkYXRhJGdyb3VwLCBsZXZlbHM9dW5pcXVlKGRhdGEkZ3JvdXApKQ0KDQp3cml0ZS5jc3YoZGF0YSxwYXN0ZTAoZGlyW251bV9vZl9tb3ZpZV0sICcvJywnYWxsX2ZyYW1lc19kZWdyZWUuY3N2JyksIHJvdy5uYW1lcyA9IFRSVUUpDQoNCn0NCiNpZihudW1fb2ZfbW92aWU9PTEpew0KICMgdG90YWxfZGF0YV9mb3JfR3JhcGg8LWRhdGENCiN9ZWxzZXsNCiAjIHRvdGFsX2RhdGFfZm9yX0dyYXBoPC1jYmluZCh0b3RhbF9kYXRhX2Zvcl9HcmFwaCxkYXRhKQ0KI30NCg0KDQoNCiN0b3RhbF9kYXRhX2Zvcl9HcmFwaCRncm91cCA8LSBmYWN0b3IodG90YWxfZGF0YV9mb3JfR3JhcGgkZ3JvdXAsIGxldmVscz11bmlxdWUodG90YWxfZGF0YV9mb3JfR3JhcGgkZ3JvdXApKQ0KDQoNCn0NCg0KdGVzdDwtcmVhZC5jc3YoIkQ6L2FsbEdyb3Vwcy9GZW1hbGVzX01hdGVkL0Fzc2FfRmVtYWxlX01hdGVkX1Vua25vd25fUmlnQV8yMDIxMTAyNVQxMjA2NDYvYWxsX2ZyYW1lc19kZWdyZWUuY3N2IikNCg0KYXZhcmdlX3Blcl9mcmFtZXM8LWFnZ3JlZ2F0ZSh0b3RhbF9kYXRhX2Zvcl9HcmFwaFssMl0sIGxpc3QodG90YWxfZGF0YV9mb3JfR3JhcGgkRnJhbWUpLCBtZWFuKQ0KDQpjb2xuYW1lcyhhdmFyZ2VfcGVyX2ZyYW1lcyk8LWMoIkZyYW1lIiwiVmFsdWUiKQ0KDQojdGl0bGUNCnRpdGxlX29mX3Bsb3Q8LXBhc3RlMChiYXNlbmFtZShwYXRoKSwiIHBsb3Qgb2YgZGdyZWUgaW4gZWFjaCAiLG51bWJlcl9vZl9mcmFtZSwiIGZyYW1lc193aXRob3V0IGFuZ2Vsc3ViIikNCg0KDQoNCmlmKGZhY2FkZT09RkFMU0Upew0KICBsaWJyYXJ5KGdncGxvdDIpDQoNCnA8LWdncGxvdCgpK2dlb21fbGluZShkYXRhID0gdG90YWxfZGF0YV9mb3JfR3JhcGgsIG1hcHBpbmcgPSBhZXMoeCA9IEZyYW1lLCB5ID0gVmFsdWUsZ3JvdXA9Z3JvdXAsY29sb3I9Z3JvdXApKSArZ2VvbV9wb2ludChkYXRhPWF2YXJnZV9wZXJfZnJhbWVzLCBhZXMoeD1GcmFtZSwgeT1WYWx1ZSksIGNvbG9yPSdyZWQnLCBzaXplID0gMyxhbHBoYSA9IDAuMTUpDQoNCg0KIHA8LXArdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsIGhqdXN0PTEpKSArZ2d0aXRsZSh0aXRsZV9vZl9wbG90KSArDQogIHhsYWIoImZyYW1lcyIpICsgeWxhYigiZGdyZWUoc3VtKSIpICt0aGVtZSgNCnBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9InJlZCIsIHNpemU9NywgZmFjZT0iYm9sZC5pdGFsaWMiKSwNCmF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvcj0iYmx1ZSIsIHNpemU9NywgZmFjZT0iYm9sZCIpLA0KYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjOTkzMzMzIiwgc2l6ZT03LCBmYWNlPSJib2xkIikNCikgKyB5bGltKDAsIDQ1KQ0KIA0KIA0KDQogcGxvdChwKQ0KICANCiBuYW1lX2Zvcl9maWxlPC1wYXN0ZTAoYmFzZW5hbWUocGF0aCksbnVtYmVyX29mX2ZyYW1lLCJfZnJhbWVzX2FsbF9tb3ZpZXNfc3VtX2RlZ3JlZV93aXRob3V0X2FuZ2Vsc3ViLnBkZiIpDQoNCmdnc2F2ZShmaWxlbmFtZSA9IG5hbWVfZm9yX2ZpbGUsZGV2aWNlPSJwZGYiLHBhdGg9IkM6L1VzZXJzL2JhcmFrbGk4L09uZURyaXZlIC0gQmFyIElsYW4gVW5pdmVyc2l0eS9MaXRhbC93ZWVrbHkgcHJlc2VudGF0aW9uL3BpY3NfZm9yX2RlZ3JlZSIpDQogDQoNCn1lbHNlew0KICANCmxpYnJhcnkoZ2dwbG90MikNCg0KcDwtZ2dwbG90KCkrZ2VvbV9saW5lKGRhdGEgPSB0b3RhbF9kYXRhX2Zvcl9HcmFwaCwgbWFwcGluZyA9IGFlcyh4ID0gRnJhbWUsIHkgPSBWYWx1ZSxncm91cD1ncm91cCxjb2xvcj1ncm91cCkpDQoNCg0KcDwtcCArIGZhY2V0X3dyYXAoICB+IGdyb3VwKQ0KDQoNCiBwPC1wK3RoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSkgK2dndGl0bGUodGl0bGVfb2ZfcGxvdCkgKw0KICB4bGFiKCJmcmFtZXMiKSArIHlsYWIoImRncmVlKHN1bSkiKSArdGhlbWUoDQpwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSJyZWQiLCBzaXplPTcsIGZhY2U9ImJvbGQuaXRhbGljIiksDQpheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwNCmF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzk5MzMzMyIsIHNpemU9NywgZmFjZT0iYm9sZCIpDQopICsgeWxpbSgwLCA0NSkNCiANCnBsb3QocCkNCg0KDQogbmFtZV9mb3JfZmlsZTwtcGFzdGUwKGJhc2VuYW1lKHBhdGgpLG51bWJlcl9vZl9mcmFtZSwiX2ZyYW1lc19hbGxfbW92aWVzX3N1bV9kZWdyZWVfZWFjaF9tb3ZpZV93aXRob3V0X2FuZ2Vsc3ViLnBkZiIpDQoNCmdnc2F2ZShmaWxlbmFtZSA9IG5hbWVfZm9yX2ZpbGUsZGV2aWNlPSJwZGYiLHBhdGg9IkM6L1VzZXJzL2JhcmFrbGk4L09uZURyaXZlIC0gQmFyIElsYW4gVW5pdmVyc2l0eS9MaXRhbC93ZWVrbHkgcHJlc2VudGF0aW9uL3BpY3NfZm9yX2RlZ3JlZSIpDQp9DQoNCiAjbGlicmFyeShnZ3Bsb3QyKQ0KDQojIGdncGxvdChhdmFyZ2VfcGVyX2ZyYW1lcyxhZXMoeD1GcmFtZSx5PVZhbHVlKSkrZ2VvbV9wb2ludCgpDQoNCg0KIA0KDQpgYGANCg0KDQoNCg0KI2NyZWF0IGdyYXBoIGZvciBvbmUgbW92aWUgaW4gcGVyZnJhbWUNCg0KYGBge3J9DQp0ZXN0PC1yZWFkLmNzdigiRDovYWxsR3JvdXBzL0ZlbWFsZXNfTWF0ZWQvQXNzYV9GZW1hbGVfTWF0ZWRfVW5rbm93bl9SaWdBXzIwMjExMDI1VDEyMDY0Ni9hbGxfZnJhbWVzX2RlZ3JlZS5jc3YiKQ0KDQoNCmFsbF9mZWF0dXJlczwtcmVhZC5jc3YoIkQ6L2FsbEdyb3Vwcy9GZW1hbGVzX01hdGVkL0Fzc2FfRmVtYWxlX01hdGVkX1Vua25vd25fUmlnQV8yMDIxMTAyNVQxMjA2NDYvcGVyZnJhbWVfc3VtX2FsbGZsaWVzLmNzdiIpDQpzdW1fcGVyX2ZyYW1lczwtdGVzdFssYygxLDMpXQ0KY29sbmFtZXMoc3VtX3Blcl9mcmFtZXMpPC1jKCJGcmFtZSIsIlZhbHVlIikNCg0KI3RpdGxlDQp0aXRsZV9vZl9wbG90PC1wYXN0ZTAoYmFzZW5hbWUocGF0aCksIiBwbG90IG9mIGRncmVlIGluIGVhY2ggIixudW1iZXJfb2ZfZnJhbWUsIiBmcmFtZXNfd2l0aG91dCBhbmdlbHN1YiIpDQoNCmFsbF9mZWF0dXJlc19uZXc8LWFsbF9mZWF0dXJlc1sxOjI3MDAwLF0NCg0KZGF0YTwtY2JpbmQoYWxsX2ZlYXR1cmVzX25ldyxzdW1fcGVyX2ZyYW1lcyRWYWx1ZSkNCg0KZGF0YV9jb3IgPC0gY29yKGRhdGFbICwgY29sbmFtZXMoZGF0YSkgIT0gIlZhbHVlIl0sICAjIENhbGN1bGF0ZSBjb3JyZWxhdGlvbnMNCiAgICAgICAgICAgICAgICBkYXRhJFZhbHVlKQ0KZGF0YV9jb3IgIA0KbGlicmFyeShjb3JycGxvdCkNCmNvcnJwbG90KGRhdGFfY29yLCBtZXRob2Q9ImNpcmNsZSIsdGwuY2V4ID0gMC41KQ0KY29ycnBsb3QoZGF0YV9jb3IsIHR5cGU9InVwcGVyIiwgb3JkZXI9ImhjbHVzdCIsIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUsdGwuY2V4ID0gMC40KQ0KDQoNCiNwbmcoZmlsZW5hbWUgPSAibXljb3JycGxvdC5wbmciLCB3aWR0aCA9IDEyMDAsIGhlaWdodCA9IDgwMCkNCmNvcnJwbG90KGRhdGFfY29yLCBtZXRob2Q9ImNpcmNsZSIsIGFkZENvZWYuY29sID0gMSwgdGwuY2V4ID0gMC41KQ0KI2Rldi5vZmYoKQ0KDQogIGxpYnJhcnkoZ2dwbG90MikNCg0KcDwtZ2dwbG90KCkrZ2VvbV9saW5lKGRhdGEgPSBzdW1fcGVyX2ZyYW1lcywgbWFwcGluZyA9IGFlcyh4ID0gRnJhbWUsIHkgPSBWYWx1ZSkpDQpwbG90KHApDQoNCg0KIA0KYGBgDQpjb3JyZWxhY3Rpb24NCg0KYGBge3J9DQoNCg0KDQp0ZXN0PC1yZWFkLmNzdigiRDovYWxsR3JvdXBzL0ZlbWFsZXNfTWF0ZWQvQXNzYV9GZW1hbGVfTWF0ZWRfVW5rbm93bl9SaWdBXzIwMjExMDI1VDEyMDY0Ni9hbGxfZnJhbWVzX2RlZ3JlZS5jc3YiKQ0KDQoNCmFsbF9mZWF0dXJlczwtcmVhZC5jc3YoIkQ6L2FsbEdyb3Vwcy9GZW1hbGVzX01hdGVkL0Fzc2FfRmVtYWxlX01hdGVkX1Vua25vd25fUmlnQV8yMDIxMTAyNVQxMjA2NDYvcGVyZnJhbWVfc3VtX2FsbGZsaWVzLmNzdiIpDQpzdW1fcGVyX2ZyYW1lczwtdGVzdFssYygxLDMpXQ0KY29sbmFtZXMoc3VtX3Blcl9mcmFtZXMpPC1jKCJGcmFtZSIsImRlZ3JlZSIpDQoNCmxpYnJhcnkoc3RyaW5ncikNCg0KDQoNCmFsbF9mZWF0dXJlc19uZXc8LWFsbF9mZWF0dXJlc1sxOjI3MDAwLF0NCg0KDQpjb2xuYW1lcyhhbGxfZmVhdHVyZXNfbmV3KTwtc3RyX3JlbW92ZShjb2xuYW1lcyhhbGxfZmVhdHVyZXNfbmV3KSwgIi5tYXQiKQ0KDQpkYXRhPC1jYmluZChhbGxfZmVhdHVyZXNfbmV3LHN1bV9wZXJfZnJhbWVzJGRlZ3JlZSkNCg0KDQoNCmRhdGFfY29yIDwtIGNvcihkYXRhWyAsIGNvbG5hbWVzKGRhdGEpICE9ICJkZWdyZWUiXSwgICMgQ2FsY3VsYXRlIGNvcnJlbGF0aW9ucw0KICAgICAgICAgICAgICAgIGRhdGEkZGVncmVlKQ0KZGF0YV9jb3IgIA0KDQpjb3IoZGF0YSkNCmxpYnJhcnkoY29ycnBsb3QpDQpjb3JycGxvdChkYXRhX2NvciwgbWV0aG9kPSJjaXJjbGUiLHRsLmNleCA9IDAuNSkNCmNvcnJwbG90KGRhdGFfY29yLCB0eXBlPSJ1cHBlciIsIG9yZGVyPSJoY2x1c3QiLCB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LHRsLmNleCA9IDAuNCkNCg0KDQpwbmcoZmlsZW5hbWUgPSAiQzovVXNlcnMvYmFyYWtsaTgvT25lRHJpdmUgLSBCYXIgSWxhbiBVbml2ZXJzaXR5L0xpdGFsL3dlZWtseSBwcmVzZW50YXRpb24vOC4wNi9teWNvcnJwbG90LnBuZyIsIHdpZHRoID0gMTIwMCwgaGVpZ2h0ID0gODAwKQ0KY29ycnBsb3QoZGF0YV9jb3IsIG1ldGhvZD0iY2lyY2xlIiwgYWRkQ29lZi5jb2wgPSAxLCB0bC5jZXggPSAwLjUpDQojZGV2Lm9mZigpDQoNCg0KI0luIHRoaXMgZXhhbXBsZSwgSeKAmWxsIGRlbW9uc3RyYXRlIGhvdyB0byBnZXQgdGhlIFBlYXJzb24gY29ycmVsYXRpb24gY29lZmZpY2llbnQgYmV0d2VlbiBhIHBhcnRpY3VsYXIgZGF0YSBmcmFtZSB2YXJpYWJsZSB3aXRoIGFsbCB0aGUgb3RoZXIgdmFyaWFibGVzIGluIHRoaXMgZGF0YSBmcmFtZS4NCg0KDQoNCiNJbiBvcmRlciB0byByZWR1Y2UgdGhlIHNoZWVyIHF1YW50aXR5IG9mIHZhcmlhYmxlcyAod2l0aG91dCBoYXZpbmcgdG8gbWFudWFsbHkgcGljayBhbmQgY2hvb3NlKSwgT25seSB2YXJpYWJsZXMgYWJvdmUgYSBzcGVjaWZpYyBzaWduaWZpY2FuY2UgbGV2ZWwgdGhyZXNob2xkIGFyZSBzZWxlY3RlZC4gSXQgaXMgc2V0IHRvIDAuNSBhcyB0aGUgaW5pdGlhbCBkZWZhdWx0Lg0KDQpsaWJyYXJ5KGRwbHlyKQ0KY29ycl9zaW1wbGUgPC0gZnVuY3Rpb24oZGF0YT1kZixzaWc9MC40KXsNCiAgI2NvbnZlcnQgZGF0YSB0byBudW1lcmljIGluIG9yZGVyIHRvIHJ1biBjb3JyZWxhdGlvbnMNCiAgI2NvbnZlcnQgdG8gZmFjdG9yIGZpcnN0IHRvIGtlZXAgdGhlIGludGVncml0eSBvZiB0aGUgZGF0YSAtIGVhY2ggdmFsdWUgd2lsbCBiZWNvbWUgYSBudW1iZXIgcmF0aGVyIHRoYW4gdHVybiBpbnRvIE5BDQogIGRmX2NvciA8LSBkYXRhICU+JSBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpDQogIGRmX2NvciA8LSBkZl9jb3IgJT4lIG11dGF0ZV9pZihpcy5mYWN0b3IsIGFzLm51bWVyaWMpDQogICNydW4gYSBjb3JyZWxhdGlvbiBhbmQgZHJvcCB0aGUgaW5zaWduaWZpY2FudCBvbmVzDQoNCiAgI2NvcnIgPC0gY29yKGRmX2NvclsgLCBjb2xuYW1lcyhkZl9jb3IpICE9ICJkZWdyZWUiXSwgICMgQ2FsY3VsYXRlIGNvcnJlbGF0aW9ucw0KICAgIyAgICAgICAgICAgICBkZl9jb3IkZGVncmVlKSANCiAgDQogIGNvcnI8LWNvcihkZl9jb3IpDQogICNwcmVwYXJlIHRvIGRyb3AgZHVwbGljYXRlcyBhbmQgY29ycmVsYXRpb25zIG9mIDEgICAgIA0KICBjb3JyW2xvd2VyLnRyaShjb3JyLGRpYWc9VFJVRSldIDwtIE5BIA0KICAjZHJvcCBwZXJmZWN0IGNvcnJlbGF0aW9ucw0KICBjb3JyW2NvcnIgPT0gMV0gPC0gTkEgDQogICN0dXJuIGludG8gYSAzLWNvbHVtbiB0YWJsZQ0KICBjb3JyIDwtIGFzLmRhdGEuZnJhbWUoYXMudGFibGUoY29ycikpDQogICNyZW1vdmUgdGhlIE5BIHZhbHVlcyBmcm9tIGFib3ZlIA0KICBjb3JyIDwtIG5hLm9taXQoY29ycikgDQogICNzZWxlY3Qgc2lnbmlmaWNhbnQgdmFsdWVzICANCiAgY29yciA8LSBzdWJzZXQoY29yciwgYWJzKEZyZXEpID4gc2lnKSANCiAgI3NvcnQgYnkgaGlnaGVzdCBjb3JyZWxhdGlvbg0KICBjb3JyIDwtIGNvcnJbb3JkZXIoLWFicyhjb3JyJEZyZXEpKSxdIA0KICAjcHJpbnQgdGFibGUNCiAgcHJpbnQoY29ycikNCiAgI3R1cm4gY29yciBiYWNrIGludG8gbWF0cml4IGluIG9yZGVyIHRvIHBsb3Qgd2l0aCBjb3JycGxvdA0KICBtdHhfY29yciA8LSByZXNoYXBlMjo6YWNhc3QoY29yciwgVmFyMX5WYXIyLCB2YWx1ZS52YXI9IkZyZXEiKQ0KICANCiAgI3Bsb3QgY29ycmVsYXRpb25zIHZpc3VhbGx5DQogIHBuZyhmaWxlbmFtZSA9ICJDOi9Vc2Vycy9iYXJha2xpOC9PbmVEcml2ZSAtIEJhciBJbGFuIFVuaXZlcnNpdHkvTGl0YWwvd2Vla2x5IHByZXNlbnRhdGlvbi84LjA2L215Y29ycnBsb3QucG5nIiwgd2lkdGggPSAxMjAwLCBoZWlnaHQgPSA4MDApDQogIGNvcnJwbG90KG10eF9jb3JyLCBpcy5jb3JyPUZBTFNFLCB0bC5jb2w9ImJsYWNrIiwgbmEubGFiZWw9IiAiLHRsLmNleCA9IDAuNTUpDQp9DQpjb3JyX3NpbXBsZShkYXRhKQ0KDQoNCg0KDQoNCg0KDQpyZXMgPC0gY29yKGRhdGEpDQoNCg0KIyBHZXQgc29tZSBjb2xvcnMNCmNvbDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkoODApDQpoZWF0bWFwKHggPSByZXMsIGNvbCA9IGNvbCwgc3ltbSA9IFRSVUUpDQoNCg0KDQoNCg0KDQoNCg0KY29ycl9tYXQgPC0gcm91bmQoY29yKGRhdGEpLDIpIA0KaGVhZChjb3JyX21hdCkNCg0KIyBJbnN0YWxsIGFuZCBsb2FkIHJlc2hhcGUyIHBhY2thZ2UNCmxpYnJhcnkocmVzaGFwZTIpDQoNCiMgY3JlYXRpbmcgY29ycmVsYXRpb24gbWF0cml4DQpjb3JyX21hdCA8LSByb3VuZChjb3IoZGF0YSksMikNCg0KIyByZWR1Y2UgdGhlIHNpemUgb2YgY29ycmVsYXRpb24gbWF0cml4DQptZWx0ZWRfY29ycl9tYXQgPC0gbWVsdChjb3JyX21hdCkNCiMgaGVhZChtZWx0ZWRfY29ycl9tYXQpDQoNCiMgcGxvdHRpbmcgdGhlIGNvcnJlbGF0aW9uIGhlYXRtYXANCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkYXRhID0gbWVsdGVkX2NvcnJfbWF0LCBhZXMoeD1WYXIxLCB5PVZhcjIsDQoJCQkJCQkJCWZpbGw9dmFsdWUpKSArDQpnZW9tX3RpbGUoKQ0KDQojIENvZGUgdG8gcGxvdCBhIHJlb3JlZGVyZCBoZWF0bWFwDQoNCiMgSW5zdGFsbCBhbmQgbG9hZCByZXNoYXBlMiBwYWNrYWdlDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KDQojIGNyZWF0aW5nIGNvcnJlbGF0aW9uIG1hdHJpeA0KY29ycl9tYXQgPC0gcm91bmQoY29yKGRhdGEpLDIpDQoNCiMgcmVvcmRlciBjb3JyIG1hdHJpeA0KIyB1c2luZyBjb3JyIGNvZWZmaWNpZW50IGFzIGRpc3RhbmNlIG1ldHJpYw0KZGlzdCA8LSBhcy5kaXN0KCgxLWNvcnJfbWF0KS8yKQ0KDQojIGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIHRoZSBkaXN0IG1hdHJpeA0KaGMgPC0gaGNsdXN0KGRpc3QpDQpjb3JyX21hdCA8LWNvcnJfbWF0W2hjJG9yZGVyLCBoYyRvcmRlcl0NCg0KIyByZWR1Y2UgdGhlIHNpemUgb2YgY29ycmVsYXRpb24gbWF0cml4DQptZWx0ZWRfY29ycl9tYXQgPC0gbWVsdChjb3JyX21hdCkNCiNoZWFkKG1lbHRlZF9jb3JyX21hdCkNCg0KI3Bsb3R0aW5nIHRoZSBjb3JyZWxhdGlvbiBoZWF0bWFwDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGF0YSA9IG1lbHRlZF9jb3JyX21hdCwgYWVzKHg9VmFyMSwgeT1WYXIyLCBmaWxsPXZhbHVlKSkgKw0KZ2VvbV90aWxlKCkNCg0KDQoNCiMgTG9hZCBhbmQgaW5zdGFsbCBoZWF0bWFwbHkgcGFja2FnZQ0KbGlicmFyeShoZWF0bWFwbHkpDQoNCiMgcGxvdHRpbmcgY29yciBoZWF0bWFwDQpoZWF0bWFwbHlfY29yKHggPSBjb3IoZGF0YSksIHhsYWIgPSAiRmVhdHVyZXMiLA0KCQkJeWxhYiA9ICJGZWF0dXJlcyIsIGtfY29sID0gMiwga19yb3cgPSAyKQ0KDQoNCg0KDQoNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KDQpteV90ID0gdHMoZGF0YVssMToyXSkNCg0KbXlfdCA9IHRzKHMsIHN0YXJ0ID0gYygyMDE5LDEpLCBmcmVxdWVuY3kgPSAxOSkNCg0KDQpwbG90KGFnZ3JlZ2F0ZShteV90KSwgdHlwZT0icCIsIHBjaD0yMCwgY2V4PTMsIHlsYWI9IkFnZ3JlZ2F0ZSBwZXIgdGltZSB1bml0IikNCg0KYGBgDQoNCmBgYHtyfQ0KDQoNCnNldC5zZWVkKDk3OTcpDQpzXzEgPSBzZXEoMjIxOjI1NikNCg0KIyBBIGN5Y2xpYyB2ZWN0b3IgZm9yIFNFQVNPTkFMIHZhcmlhdGlvbnMuDQpzXzIgPSBjb3Moc2VxKGZyb209MS8xMipwaSwgdG89NipwaSwgYnk9KDYqcGkvMzYpKSkqNQ0KDQojIFJhbmRvbSBudW1iZXJzIGZvciBlcnJvcnMgKHdoaXRlIG5vaXNlKS4NCnNldC5zZWVkKDY1KQ0Kc18zID0gcm5vcm0oMzYpDQoNCiMgVGhlIGRhdGEgdmVjdG9yLg0KcyA9IHNfMSArIHNfMiArIHNfMw0KDQojIFRoZSB0aW1lIHNlcmllcyBvYmplY3QgaXMgY3JlYXRlZC4NCm15X3QgPSB0cyhzLCBzdGFydCA9IGMoMjAxOSwxKSwgZnJlcXVlbmN5ID0gMTIpDQoNCiMgUGxvdCB0aGUgdGltZSBzZXJpZXMuDQpwbG90KG15X3QsIHlsYWIgPSAiVmFsdWVzIikNCmBgYA0KDQpgYGB7cn0NCnh0cyhkYXRhJFZhbHVlLCBhcy5EYXRlKGRhdGEkRnJhbWUpKQ0KDQoNCg0KIGxpYnJhcnkoem9vKQ0KICNaT08gPC0gem9vKGRhdGEkVmFsdWUsIGFzLmNoYXJhY3RlcihkYXRhJEZyYW1lKSkNCiBaT08gPC0gem9vKGRhdGEkVmFsdWUpDQoNCiBteV90PC10cyhaT08sZnJlcXVlbmN5ID0gMjcwMCkNCiBwbG90KG15X3QpDQogDQogDQpwbG90KGFnZ3JlZ2F0ZShteV90KSwgdHlwZT0icCIsIHBjaD0yMCwgY2V4PTMsIHlsYWI9IkFnZ3JlZ2F0ZSBwZXIgdGltZSB1bml0IikNCg0KbGlicmFyeShsdWJyaWRhdGUpDQoNCmxpYnJhcnkoZm9yZWNhc3QpDQoNCm15X3ZlYzwtYXMudmVjdG9yKGRhdGEkVmFsdWUpDQpteXRzIDwtIHRzKG15X3ZlYywgc3RhcnQ9YygxLCAxKSwgZnJlcXVlbmN5PTI3MDApDQoNCg0KIHBsb3QobXl0cykNCiBmaXQgPC0gc3RsKG15dHMsIHMud2luZG93PSJwZXJpb2QiKQ0KDQpwbG90KGZpdCkNCg0KZml0IDwtIGF1dG8uYXJpbWEobXlfdCkNCmZvcmVjYXN0KGZpdCwgMjApDQoNCg0KcGxvdChmb3JlY2FzdChmaXQsIDIwMDApKQ0KYGBgDQoNCg==